package com.it.schoolbookshop_back.mapper;

import com.it.schoolbookshop_back.entities.po.Book;
import com.it.schoolbookshop_back.entities.dto.BookResponseDTO;
import com.it.schoolbookshop_back.entities.dto.SoldBookDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;

import java.math.BigDecimal;
import java.util.List;

/**
 * 书籍数据访问层接口
 */
@Mapper
public interface BookMapper {
    
    /**
     * 获取所有书籍信息，支持按价格区间、品相过滤和排序
     * 
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @param bookCondition 书本品相
     * @param orderBy 排序字段
     * @param sortDirection 排序方向
     * @return 书籍列表
     */
    List<Book> getBooks(
            @Param("minPrice") BigDecimal minPrice, 
            @Param("maxPrice") BigDecimal maxPrice,
            @Param("bookCondition") String bookCondition,
            @Param("orderBy") String orderBy,
            @Param("sortDirection") String sortDirection);

    /**
     * 获取所有书籍信息（包含卖家信息），支持按价格区间、品相过滤和排序
     * 
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @param bookCondition 书本品相
     * @param orderBy 排序字段
     * @param sortDirection 排序方向
     * @return 包含卖家信息的书籍列表
     */
    List<BookResponseDTO> getBooksWithSeller(
            @Param("minPrice") BigDecimal minPrice, 
            @Param("maxPrice") BigDecimal maxPrice,
            @Param("bookCondition") String bookCondition,
            @Param("orderBy") String orderBy,
            @Param("sortDirection") String sortDirection);
    
    /**
     * 获取用户发布的书籍，可根据状态筛选
     * 
     * @param sellerId 卖家ID
     * @param status 书籍状态（可以为null，表示查询所有状态）
     * @return 书籍列表
     */
    List<Book> getBooksBySeller(
            @Param("sellerId") Integer sellerId, 
            @Param("status") String status);
    
    /**
     * 根据ID获取书籍
     * 
     * @param id 书籍ID
     * @return 书籍信息
     */
    Book getBookById(@Param("id") Integer id);
    
    /**
     * 新增书籍
     * 注：该方法在XML中实现
     * 
     * @param book 书籍信息
     * @return 影响行数
     */
    int addBook(Book book);
    
    /**
     * 更新书籍信息
     * 
     * @param book 书籍信息
     * @return 影响行数
     */
    int updateBook(Book book);
    
    /**
     * 删除书籍
     * 
     * @param id 书籍ID
     * @return 影响行数
     */
    int deleteBook(@Param("id") Integer id);

    /**
     * 获取推荐书籍列表
     * 根据指定书籍的分类和作者查找类似的书籍
     * 
     * @param bookId 参考书籍ID
     * @param categoryId 分类ID
     * @param author 作者
     * @param limit 返回数量限制
     * @return 推荐书籍列表
     */
    List<BookResponseDTO> getRecommendBooks(
            @Param("bookId") Integer bookId,
            @Param("categoryId") Integer categoryId,
            @Param("author") String author,
            @Param("limit") Integer limit);

    /**
     * 根据ID获取书籍详情，包含卖家和分类信息
     * 
     * @param id 书籍ID
     * @return 包含卖家和分类信息的书籍详情
     */
    BookResponseDTO getBookDetailById(@Param("id") Integer id);

    /**
     * 增加书籍浏览次数
     * 
     * @param bookId 书籍ID
     * @return 影响行数
     */
    int incrementBookViews(@Param("bookId") Integer bookId);

    /**
     * 更新书籍状态
     * 
     * @param bookId 书籍ID
     * @param status 书籍状态
     * @return 影响的行数
     */
    int updateBookStatus(@Param("bookId") Integer bookId, @Param("status") String status);

    /**
     * 获取已售出的书籍
     * 根据用户ID查询该用户已售出的书籍信息
     * 
     * @param sellerId 卖家ID
     * @return 已售出的书籍列表
     */
    List<SoldBookDTO> getSoldBooks(@Param("sellerId") Integer sellerId);

    /**
     * 获取已购买的书籍
     * 根据用户ID查询该用户已购买的书籍信息
     * 
     * @param buyerId 买家ID
     * @return 已购买的书籍列表
     */
    List<SoldBookDTO> getBoughtBooks(@Param("buyerId") Integer buyerId);

    /**
     * 获取已售出的书籍
     * 根据用户ID查询该用户已售出的书籍信息
     * 
     * @param sellerId 卖家ID
     * @return 已售出的书籍列表
     */
    List<SoldBookDTO> getSoldBooksByUser(@Param("sellerId") Integer sellerId);
    
    /**
     * 根据ID获取书籍标题
     * 
     * @param bookId 书籍ID
     * @return 书籍标题
     */
    String getBookTitleById(@Param("bookId") Integer bookId);
} 